package untils

import (
	"sync"
	"time"
)

// 全局雪花算法实例
var snowflake *Snowflake

// 初始化
func init() {
	snowflake = &Snowflake{}
}

// Snowflake 雪花算法结构体
type Snowflake struct {
	mu            sync.Mutex
	lastTimestamp int64
	sequence      int64
}

// 雪花算法参数
const (
	epoch        = 1704038400000       // 2024-01-01 00:00:00 UTC的毫秒时间戳
	sequenceBits = 12                  // 序列号位数
	maxSequence  = 1<<sequenceBits - 1 // 4095
)

// GenerateID 生成唯一ID - 直接调用这个函数即可
func GenerateID() int64 {
	return snowflake.generate()
}

// GenerateGroupID 生成群聊ID - 专门为群聊封装的函数
func GenerateGroupID() int64 {
	return GenerateID()
}

// generate 内部生成方法
func (s *Snowflake) generate() int64 {
	s.mu.Lock()
	defer s.mu.Unlock()

	// 获取当前时间戳（毫秒）
	timestamp := time.Now().UnixMilli()

	if timestamp < s.lastTimestamp {
		// 时钟回拨处理：等待时钟追上
		for timestamp <= s.lastTimestamp {
			time.Sleep(100 * time.Microsecond)
			timestamp = time.Now().UnixMilli()
		}
	}

	if timestamp == s.lastTimestamp {
		s.sequence = (s.sequence + 1) & maxSequence
		if s.sequence == 0 {
			// 同一毫秒内序列号用尽，等待下一毫秒
			for timestamp <= s.lastTimestamp {
				time.Sleep(100 * time.Microsecond)
				timestamp = time.Now().UnixMilli()
			}
		}
	} else {
		s.sequence = 0
	}

	s.lastTimestamp = timestamp

	// 生成ID: (时间戳 - 纪元) << 序列号位数 | 序列号
	return (timestamp-epoch)<<sequenceBits | s.sequence
}
